package cn.biplam.front.htmlscript.script;

import java.util.ArrayList;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 *  页面提交时输入对象值检查脚本模板
 *  <ul>用法：
 *    <li>创建：     new ValueCheckScript("检查通过后执行的提交脚本");
 *    <li>放入检查项: putItem("被检查对象页面ID","检查类型","检查未通过提示信息");
 *    <li>获取脚本：  getScript();
 *  </ul>
 * @author XiaoRuxing Oct 23, 20093:35:27 PM
 * @version 1.0
 */
public class ValueCheckScript {

	/** 被检查的容器ID */
	private ArrayList<String> checkItems;
	/** 检查类型 */
	private KvMap<String, Check_Type> checkType;
	/** 检查提示信息 */
	private KvMap<String, String> alertInfo;
	
	/** 检查后提交脚本 */
	private String submitScript;
	/** 被提交容器ID */
	private String submitCid;
	
	/**
	 * 页面值检查类型
	 */
	public enum Check_Type{
		/**  空值检查 */
		Empty_check("1");
		private String value;
		private Check_Type(String value){this.value=value;}
		public String toString() {return value;}
	}

	/**
	 * @param submitCId    被提交容器ID
	 * @param submitScript 检查通过后的页面提交脚本
	 */
	public ValueCheckScript(String submitCId,String submitScript){
		this.submitCid = submitCId;
		this.submitScript = submitScript;
		this.checkItems = new ArrayList<String>();
		this.checkType = new KvMap<String, Check_Type>();
		this.alertInfo = new KvMap<String, String>();
	}
	
	/**
	 *  放入检查项,检查对象是否为空
	 * @param cName       被检查页面对象名称,不能为空
	 * @param alertInfo 不符合条件时的提示信息
	 * @throws ErrorMessage 
	 */
	public void putItem(String cName,String alertInfo) throws ErrorMessage{
		this.putItem(cName, Check_Type.Empty_check, alertInfo);
	}
	
	/**
	 *  放入检查项
	 * @param cName       被检查页面对象名称,不能为空
	 * @param checkType 检查类型,不能为空
	 * @param alertInfo 不符合条件时的提示信息
	 * @throws ErrorMessage 
	 */
	public void putItem(String cName,Check_Type checkType,String alertInfo) throws ErrorMessage{
		if(TOOLS.StringIsEmpty(cName)){
			throw new ErrorMessage("Id of the componet which is checked  is null at ValueCheckScript!");
		}
		if(checkType==null){
			throw new ErrorMessage("Check Type  is null at ValueCheckScript!");
		}
		this.checkItems.add(cName);
		this.checkType.put(cName, checkType);
		this.alertInfo.put(cName, alertInfo);
	}
	
	/**
	 *  放入检查项,用于检查隐藏Input值,检查对象是否为空
	 * @param cName       被检查页面隐藏对象对应字段名称,不能为空
	 * @param alertInfo 不符合条件时的提示信息
	 * @throws ErrorMessage 
	 */
	public void putHiddenItem(String cName,String alertInfo) throws ErrorMessage{
		this.putHiddenItem(","+cName, Check_Type.Empty_check, alertInfo);
	}
	
	/**
	 *  放入检查项,用于检查隐藏Input值
	 * @param cName       被检查页面隐藏对象对应字段名称,不能为空
	 * @param checkType 检查类型,不能为空
	 * @param alertInfo 不符合条件时的提示信息
	 * @throws ErrorMessage 
	 */
	public void putHiddenItem(String cName,Check_Type checkType,String alertInfo) throws ErrorMessage{
		this.putItem(","+cName, checkType, alertInfo);
	}
	
	/**
	 * @return 页面提交脚本,如果满足检查条件执行提交脚本,不满足弹出提示信息
	 */
	public String getScript(){
		StringBuilder script = new StringBuilder();
		script.append("if(inputCheck('"+this.submitCid+"','"+setCheckField()+"')){");
		script.append(this.submitScript);
		script.append("}else{return;};");
		return script.toString();
	}
	
	/**
	 * 将需要检查的字段分割成 表单名称1^为空的提示信息1^检查类型1&表单名称2^为空的提示信息2^检查类型2....
	 */
	private String setCheckField(){
		StringBuilder sb = new StringBuilder();
		String itemId = null;
		for(int i=0;i<checkItems.size();i++){
			if(i!=0){
				sb.append("&");
			}
			itemId = checkItems.get(i);
			sb.append(itemId);
			sb.append("^");
			sb.append(alertInfo.getByKey(itemId));
			sb.append("^");
			sb.append(checkType.getByKey(itemId));
		}
		return sb.toString();
	}
}
